package com.zyf.project.kvdb.wal.walinf;

import java.io.IOException;
import java.io.Serializable;

/**
 * <h1>预写日志接口</h1>
 * <p>通过预写日志，可以保证数据操作的原子性和持久性</p>
 * <p>继承了 {@link AutoCloseable} 类，解决总是需要手动关闭资源的问题，JDK 版本1.7以上</p>
 *
 * @author Zhou Yifan
 */
public interface Wal<E extends Serializable> extends AutoCloseable {

    /**
     * 追加日志
     *
     * @param data 待处理数据
     * @return 写入的字节长度
     * @throws IOException IO异常
     */
    int append(E data) throws IOException;

    /**
     * 设置最新日志快照，旧的日志将不再读取，并且将在未来某一时刻被清除
     *
     * @throws IOException IO异常
     */
    void checkpoint() throws IOException;

    /**
     * 刷盘
     *
     * @throws IOException IO异常
     */
    void flush() throws IOException;

    /**
     * 清空日志
     *
     * @throws IOException IO异常
     */
    void clear() throws IOException;


    /**
     * 前向迭代器
     *
     * @return {@link WalIterator}
     * @throws IOException IO异常
     */
    WalIterator<E> forwardIterator() throws IOException;

    /**
     * 反向迭代器
     *
     * @return {@link WalIterator}
     * @throws IOException IO异常
     */
    WalIterator<E> backwardIterator() throws IOException;
}